package cn.deschen.search.mysql;

import cn.deschen.search.mysql.utils.SerializableUtil;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.json.JSONUtil;
import com.github.shyiko.mysql.binlog.event.EventType;
import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Author hanbin_chen
 * @Description 封装binlog数据库变更记录的数据结构，用于做为更新本地索引的数据
 * @DateTime 2021/6/9
 * @Version V1.0.0
 */
@Data
public class BinlogRowData {

    /**
     * 数据库名
     */
    private String database;

    /**
     * 数据表名
     */
    private String tableName;

    /**
     * 操作事件
     */
    private EventType eventType;

    /**
     * 变更记录
     * 格式：集合：字段名 -> 字段值
     */
    private List<Map<String, Serializable>> rowDataList;

    public String getMsgId() {
        return tableName + ":" + eventType.name() + ":" + getTableId() + ":" + MD5.create().digestHex16(JSONUtil.toJsonStr(rowDataList));
    }

    public Long getTableId() {
        return SerializableUtil.parse2Long(rowDataList.stream().filter(map -> null != map.get("id")).map(map -> map.get("id")).collect(Collectors.toList()).get(0));
    }
}
